﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Compiler.TableOfSymbols;

namespace Compiler.CompilerAPI.Contexts
{
    /// <summary>
    /// Контекст семантического анализа
    /// </summary>
    public abstract class Context
    {
        private NETTypesBijectiveMap typesBijectiveMap;

        public NETTypesBijectiveMap TypesBijectiveMap
        {
            get { return typesBijectiveMap; }
        }

        public Context(NETTypesBijectiveMap typesBijectiveMap)
        {
            System.Diagnostics.Debug.Assert(typesBijectiveMap != null,
                String.Format("typesBijectiveMap can not be null"));
            this.typesBijectiveMap = typesBijectiveMap;
        }

        /// <summary>
        /// Ищет в контексте информацию о типе
        /// </summary>
        /// <param name="name">Имя типа</param>
        /// <param name="qualifier">Квалификатор пространств имён</param>
        /// <returns>Информацию о результатах поиска (включает тип, если найден)</returns>
        public virtual TypeSearchInfo TryGetTypeInfo(string name, string qualifier)
        {
            return new TypeSearchInfo(true, false);
        }

        /// <summary>
        /// Проверяет, определена ли в контексте какая-нибудь 
        /// структурная единица с именем name
        /// </summary>
        /// <param name="name">Имя</param>
        /// <returns>Истину, если в контексте определена единица с именем name</returns>
        public abstract bool ContainsDefinedName(string name);

        /// <summary>
        /// Добавляет в контекст определение новой структурной единицы
        /// </summary>
        /// <param name="name">Имя новой единицы</param>
        /// <param name="data">Данные структурной единицы</param>
        public abstract void AddNewDefinition(string name, SymbolTableData data);
    }
}
